#ifndef __LINKTREE_H__
#define __LINKTREE_H__

#include <string>
#include "DynamicArray.h"

using ElementType = std::string;
// 节点
class TreeNode
{
public:
    // 带参构造
    TreeNode(const ElementType &element);
    // 节点连接：将节点绑定为另一个结点的孩子
    void Connect(TreeNode *parent); 
    // 解绑：将一个节点从另外一个节点上断开
    void DisConnect(TreeNode *parent); 
    // 找节点（加static表示这个函数不依赖类本身，属于功能函数）
    static TreeNode *FindNode(TreeNode *node, const ElementType &element);
    // 找节点
    static void FindNode(TreeNode *node, const ElementType &element, DARRAY::DynamicArray &a);
    // 释放节点
    static void FreeNode(TreeNode *node);
    // 获取节点高度
    static int GetNodeHeight(TreeNode *node);
    // show
    void show(TreeNode *node, int depth); 
    // 获取双亲指针
    TreeNode *GetParent();
    // 获取数据域
    std::string &GetData();
    // 设置数据域
    void SetData(const ElementType &element);
private:
    ElementType data; // 数据域
    TreeNode *parent; // 双亲指针
    TreeNode *FirstChild; // 孩子指针
    TreeNode *nextSbling; // 下一个兄弟指针
};

// 树
class LinkTree
{
public:
    // 无参构造
    LinkTree();
    // 带参构造
    LinkTree(const ElementType &element);
    // 析构
    ~LinkTree();
    // 获取根节点地址
    TreeNode *GetRoot();
    // show                                    
    void show();
    // 找节点
    DARRAY::DynamicArray FindByElement(const ElementType &element);
    // 获取树的高度
    int GetTreeHeight();
    // 获取节点路径
    std::string GetNodePath(TreeNode *node);
private:
    TreeNode *root; //根节点
};

#endif